﻿// 创建时间轮调度器，每1秒一个tick，60个槽(即最大可调度1分钟后的任务)
using System.Xml;
using 自定义定时任务.Common;

#region xml 文件解析
XmlDocument doc = new XmlDocument();
doc.Load("Log/LogNet.config");
XmlNodeList nodes = doc.SelectNodes("/configuration/log4net/appender");
foreach (XmlNode item in nodes)
{
    string name = item.Attributes["name"].Value;
    string type = item.Attributes["type"].Value;
    Console.WriteLine($"name: {name}, type: {type}");
    /*
         //param	从整个文档中查找所有 param 节点
        .//param	从当前节点起，在其子孙中查找 param 节点
    */
    foreach (XmlNode paramNode in item.SelectNodes(".//param"))
    {
        string paramName = paramNode.Attributes["name"].Value;
        string paramValue = paramNode.Attributes["value"].Value;
        Console.WriteLine($"\tparam name: {paramName}, value: {paramValue}");
    }
    
}

#endregion
return;

#region 定时任务测试

var scheduler = new TimeWheelScheduler(1000, 60);
scheduler.Start();

Console.WriteLine("Scheduling tasks...");
Console.WriteLine($"Current time: {DateTime.Now:HH:mm:ss}");

// 调度一个5秒后执行的一次性任务
scheduler.ScheduleOnce(() =>
{
    Console.WriteLine($"One-time task executed at {DateTime.Now:HH:mm:ss}");
}, TimeSpan.FromSeconds(5));

// 调度一个10秒后开始，每隔3秒执行的周期性任务
scheduler.ScheduleRecurring(() =>
{
    Console.WriteLine($"Recurring task executed at {DateTime.Now:HH:mm:ss}");
}, TimeSpan.FromSeconds(5),TimeSpan.FromSeconds(10));

// 调度一个 14：23分执行的任务
scheduler.ScheduleAt(() => 
{
    Console.WriteLine($"Crontab task executed at {DateTime.Now:HH:mm:ss}");
}, DateTime.Parse("2025-04-22 14:24:30"));

// 每分钟的第30秒执行
scheduler.ScheduleCron(() =>
{
    Console.WriteLine($"Cron job 1 executed at {DateTime.Now:HH:mm:ss}");
}, "30 * * * * *"); // 秒 分 时 日 月 周

// 每天上午10点和下午2点执行
scheduler.ScheduleCron(() =>
{
    Console.WriteLine($"Cron job 2 executed at {DateTime.Now:HH:mm:ss}");
}, "0 0 10,14 * * *");

// 每5分钟执行一次
scheduler.ScheduleCron(() =>
{
    Console.WriteLine($"Cron job 3 executed at {DateTime.Now:HH:mm:ss}");
}, "0 */5 * * * *");

// 让程序运行一段时间以便观察任务执行
Console.ReadLine();

scheduler.Stop();
Console.WriteLine("Scheduler stopped.");


AppDomain.CurrentDomain.ProcessExit += (sender, e) =>
{
    try
    {
        scheduler.Dispose();
    }
    catch (Exception ex)
    {

    }
};

#endregion
